package com.sen.patterns.creational.singleton.ex3;

import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;

/**
 * 配置管理
 * 
 * @author sen
 * 
 */
public class ConfigManager {

	/**
	 * 属性文件全名
	 */
	private static final String P_FILE = "D:/doc/conf.properties";

	/**
	 * 对应于属性文件的文件对象变量
	 */
	private File file;

	/**
	 * 属性文件的最后修改日期
	 */
	private long lastModifiedTime = 0;

	/**
	 * 属性文件所对应的属性对象变量
	 */
	private Properties props = null;

	/**
	 * 本类可能存在的唯一的一个实例
	 */
	private static ConfigManager M_INSTANCE = new ConfigManager();

	/**
	 * 私有构造函数
	 */
	private ConfigManager() {
		file = new File(P_FILE);
		lastModifiedTime = file.lastModified();

		if (lastModifiedTime == 0) {
			System.err.println(P_FILE + "文件不存在！");
		}

		props = new Properties();

		try {
			props.load(new FileInputStream(file));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 获取实例
	 * 
	 * @return 返回ConfigManagern类的单一实例
	 */
	public static ConfigManager getInstance() {
		return M_INSTANCE;
	}

	/**
	 * 读取一特定的属性项
	 * 
	 * @param name
	 *            属性项的项名
	 * @param defaultVal
	 *            属性项的缺省值
	 * @return 属性项的值(如此项存在), 缺省值(如此项不存在)
	 */
	public final String getConfigItem(String name, String defaultVal) {
		long newTime = file.lastModified();
		// 检查属性文件是否被其它程序(多数情况是程序员手动)修改过。
		// 如果是，重新读取此文件。
		if (newTime == 0) {
			
			// 属性文件不存在
			if (lastModifiedTime == 0) {
				System.err.println(P_FILE + " 文件不存在!");
			} else {
				System.err.println(P_FILE + " 文件已删除!");
			}
			return defaultVal;
			
		} else if (newTime > lastModifiedTime) {
			
			props.clear();
			try {
				props.load(new FileInputStream(P_FILE));
			} catch (Exception e) {
				e.printStackTrace();
			}
			
		}
		lastModifiedTime = newTime;

		String val = props.getProperty(name);
		if (val == null) {
			return defaultVal;
		} else {
			return val;
		}
	}
}
